https://m.youtube.com/watch?v=emeTkdTQgGA&pp=ygUKbmRjIGVtYmFyaw%3D%3D

안녕하세요, 저는 Embark Studios의 3D 아티스트인 Erich Hallberg입니다. Embark에서는 3D 에셋의 높은 퀄리티를 보장하고, 더 나은 콘텐츠 제작 툴을 통해 프로젝트의 방대한 콘텐츠 범위를 가능하게 하는 데 집중하고 있습니다. 이전에는 영화 산업과 EA Dice에서 Battlefield 4, 5, Star Wars Battlefront 등의 타이틀에 3D 아티스트, 웨폰 아티스트, 레벨 아티스트로 참여했습니다.
본 발표는 게임용 하드 서페이스 에셋(프롭, 차량, 무기 등) 제작 또는 제작에 관심 있는 모든 분들을 대상으로 합니다. 또한 캐릭터의 갑옷이나 장비와 같은 하드 서페이스 디테일에도 해당됩니다. Embark에서는 게임 개발 시 하드 서페이스 에셋 구축 방식을 변화시켜 왔습니다.
본 발표에서는 하드 서페이스 에셋 제작 자동화 프로세스를 논의하며, 아티스트는 최소한의 입력만으로 작업하도록 합니다. 자동 UV, 자동 하이 폴리, 자동 베이킹에 대한 저희의 접근 방식을 살펴보겠습니다. 저희 워크플로우가 어떻게 구성되는지, 절차적 프로세스의 각 단계를 살펴보고 툴 개발을 안내하는 전반적인 철학에 대해 논의할 것입니다.
이후에는 하드 서페이스 게임 아트 제작에 사용되는 가장 일반적인 현재 워크플로우를 다룹니다. 좋은 하드 서페이스 에셋 제작에 필요한 많은 부분을 자동화할 수 있는 이유를 설명할 것입니다. 저희 프로세스가 기술적이고 비예술적인 부분을 대부분 처리하여 아티스트가 해당 과정에 대해 생각하거나 알 필요가 없도록 하는 방법을 보여드릴 것입니다. 마지막으로, 저희가 배운 점과 프로세스가 앞으로 어떻게 발전할지에 대해 이야기할 것입니다.

하드 서페이스(hard surface) 에셋 제작 시, subdivision modeling은 가장 오래된 워크플로우 중 하나입니다. 빠르고 쉽게 에셋을 만들 수 있지만, 몇 가지 심각한 문제가 있습니다. subdivision modeling으로 복잡한 형태를 만드는 것은 상당히 어렵고, 숙달하는 데 많은 시간이 소요됩니다. topology에 대한 깊은 이해가 필요하며, 더욱이 형태를 변경하려면 기존 topology를 제거하고 새로운 topology를 다시 만들어야 합니다.
edge에 crease weights를 추가하는 기능은 subdivision modeling을 더 쉽고 제어 가능하게 만들었지만, 여전히 가장 많은 시간이 소요되는 부분인 좋은 topology에 의존합니다. 아마도 두 번째로 흔한 워크플로우는 상당한 변화를 가져왔을 것입니다.

좋아 보이는 high poly를 만들기 위해 ZBrush의 DynaMesh와 Polish 기능을 활용했습니다. 이는 subdivision modeling의 어려움과 시간 소모를 크게 줄여줍니다. 더 이상 mesh의 underlying topology에 신경 쓸 필요가 없으며, 과정을 단순한 기계적 단계로 나눌 수 있습니다. DynaMesh, Polish, Decimate 순서로 진행하는 것입니다. 하지만 여전히 시간이 많이 소요된다는 문제가 있습니다. 각 asset의 부위에 대해 단계를 반복해야 하기 때문입니다. 또한 ZBrush에 대한 약간의 지식이 필요하므로 여전히 어느 정도 난이도가 있습니다. 가장 중요한 것은 이 과정이 destructive하다는 점입니다. 즉, input geometry에 변경이 있을 경우 모든 단계를 다시 거쳐야 합니다.

최근 주목받는 하이폴리 모델 제작 워크플로우 중 하나는 Fusion 360과 같은 CAD 소프트웨어를 활용하는 것입니다. 이 방식은 게임 개발에 필요한 수준을 훨씬 뛰어넘는 매우 깔끔하고 정밀한 결과물을 제공합니다.
다만, 아티스트가 별도의 소프트웨어를 학습해야 하는 단점이 있습니다. 또한, 하이폴리 모델과 분리된 로우폴리 모델을 별도로 제작해야 하는 추가적인 문제도 존재합니다.

아티스트가 high poly 모델을 어디에서 제작했는지에 상관없이, high poly 모델과 밀접하게 일치하면서도 분리된 low poly 모델을 제작해야 합니다. 이후 해당 low poly에 대한 UV를 생성하고, normals 및 ambient occlusion과 같은 정보를 baking할 수 있도록 메쉬 설정을 완료해야 합니다.

이러한 워크플로우의 모든 부분은 근본적인 문제점을 공유합니다. 숙달하기 어렵고, 이전 단계에서 변경 사항이 발생할 때마다 각 단계를 다시 거쳐야 하므로 반복 속도가 매우 느립니다. 게임 개발 과정에서 변경 사항은 빈번하게 발생합니다. UV, 베이킹 또는 하이폴리 모델 제작의 기술적인 단계 대부분에는 진정으로 예술적인 요소가 없으므로, 인간이 이러한 작업에 시간을 할애할 필요는 없습니다. 이들은 모두 규칙 기반의 반복적인 작업이므로 자동화에 완벽하게 적합합니다.
Embark에서 개발 중인 프로세스는 Houdini의 procedural dependency graph를 통해 일련의 프로세스를 실행합니다. 이는 전체 프로세스를 매우 모듈화하고 조정하기 쉽게 만드는 강력한 시스템입니다. 하드 서페이스 프로세스 개선에서 추구하는 바는 다음과 같습니다. 아티스트의 워크플로우를 간소화하고 최종 에셋의 통일된 룩을 위해 입력 및 결과를 표준화합니다. 이를 통해 모든 에셋에 걸쳐 높은 품질을 유지하면서 유사한 룩앤필을 확보하고, 동시에 개별 아티스트의 프로세스를 더욱 용이하게 만들 수 있습니다.
수작업을 최소화하고자 합니다. 즉, export 및 import와 같은 모든 수동 단계를 제거하고, 자동화된 프로세스가 부재했기 때문에 지금까지 수동으로 이루어졌던 모든 단계를 제거하고자 합니다. 새로운 소프트웨어 학습과 소프트웨어 간 콘텐츠 이동에 많은 시간이 소요되는 경우가 많습니다. 따라서 아티스트가 가장 편안함을 느끼는 Blender 내에서 작업을 수행할 수 있도록 보장하고자 합니다. 개별 아티스트가 자동화 가능한 모든 영역을 제어할 필요는 없습니다. 대신, Texel density, 쉘 간 패딩 양, 베이킹 설정 등은 툴 자체에서 설정될 수 있습니다.
빠른 반복 속도는 아마도 가장 중요한 지점일 것입니다. 에셋 변경이 전체 시간 예산의 큰 부분을 차지하지 않도록 할 수 있어야 합니다. 품질 개선을 공고히 한다는 것은, 품질을 높이기 위한 새로운 기법이 발견될 때 개인의 노하우에 얽매이지 않아야 함을 의미합니다. 대신, 아티스트가 최고의 결과보다 못한 결과를 만드는 것이 거의 불가능해야 합니다. 마지막으로, 툴셋과 워크플로우는 모든 유형의 하드 서페이스 에셋에 동일하게 적용되어야, 아티스트가 다양한 유형의 에셋을 작업하는 것을 더욱 용이하게 할 수 있습니다. 이제 이면의 작동 방식을 자세히 알아보기 전에 실제 모습을 간략하게 살펴보겠습니다.

이러한 간단한 패스트푸드 레스토랑 테이블과 같은 에셋에 대한 툴 사용자의 관점에서 워크플로우를 빠르게 살펴보겠습니다. 먼저, 아티스트는 최종 인게임 버전에서 의도된 대로 로우 폴리(low poly) 객체의 단순한 형태를 모델링합니다. 그 후 추가적인 입력 지오메트리(input geometries)를 모델링할 차례입니다. 여기서는 이 에셋에 사용된 부울(Boolean) 오브젝트가 생성되었습니다. 다리의 구멍을 위한 몇 개의 작은 빼기(subtraction) 실린더와 나무 질감이 표현될 부분에 대한 더 큰 교차(intersection) 볼륨입니다. 그리고 나무를 개별 판자로 나누는 데 사용되는 몇 개의 평면이 추가됩니다. 추가적인 디테일을 위해 금속 프레임의 용접이 나타날 영역을 지정하는 몇 개의 박스가 추가됩니다. 마지막으로 금속 프레임 측면에 볼트가 추가될 위치를 프로세스에 알려주는 여러 개의 실린더가 있습니다.

여기까지가 설정입니다. 이제 아티스트가 process 버튼을 누르면 잠시 후 완성된 baked asset이 Blender viewport에 나타납니다.

Blender에서 처음부터 최종 baked asset까지, 아티스트 Maxi가 약 15분 만에 완성하였습니다.

해당 과정이 비교적 간단하게 보였기를 바랍니다. 이제 내부 프로세스에서 실제로 어떤 일이 일어나는지 살펴보겠습니다. Houdini 내 각 단계에서 발생하는 일들을 자세히 알아보겠습니다. 이를 파악하고 설정하는 데 상당한 시간이 소요된 흥미로운 내용들이 많습니다.
사용자는 이러한 과정이 어떻게 이루어지는지에 대해 전혀 신경 쓸 필요가 없습니다. 사용자가 경험하는 것은 방금 보신 패스트푸드 테이블과 같은 사용자 경험입니다. 간단한 입력 지오메트리 객체를 생성하고 'process' 버튼을 누르면 됩니다.
아티스트는 프로세스에 어떤 작업을 수행해야 하는지 지시하는 몇 가지 방법을 가지고 있습니다. Blender에서 일반적인 방식으로 각진 엣지(hard edges), 크리스(creases), UV 심(UV seams)이 설정된 기본적인 low poly 지오메트리를 추가할 수 있습니다.
테이블 다리의 작은 부분처럼 Boolean 연산에 사용되는 객체나 나무 질감을 위한 더 큰 교차 객체(intersection objects)를 추가할 수도 있습니다. 이 외에도 추가적인 입력 지오메트리들이 있습니다.

용접을 생성하는 데 사용되는 박스에 대한 설명입니다. 주요 입력은 에셋이 완성되었을 때 게임에 표시될 로우 폴리(low poly) 모델입니다. 로우 폴리 모델부터 시작한 이유는 몇 가지입니다. 로우 폴리 모델만이 게임에 실제로 사용되는 지오메트리(geometry)이기 때문입니다. 또한 아티스트가 하이 폴리(high poly) 모델보다 로우 폴리 모델을 만드는 것이 훨씬 더 쉽습니다.
더불어, 수작업으로 정교하게 만든 로우 폴리 모델에 대한 좋은 자동 UV(UVs) 생성이, 하이 폴리 모델에서 생성된 로우 폴리 지오메트리에 대한 UV 생성보다 훨씬 직관적입니다. 또한, 하이 폴리 모델에서 보기 좋은 자동 로우 폴리 모델을 만드는 것은 종종 완벽하게 날카롭거나 완벽하게 평평한 표면을 요구하는 하드 서페이스(hard surface) 에셋에 대해 매우 어렵습니다.
이후, 사용자는 하이 폴리 모델의 외형을 변경할 수 있는 모든 기본 불리언(boolean) 객체들을 입력할 수 있습니다. 모든 논-불리언(non-boolean) 객체 또한 빼기 불리언으로 태그(tag)할 수 있어, 파트 간의 교차(intersection)가 전혀 발생하지 않도록 합니다.
왼쪽의 갈색 교차 박스(intersection boxes)에 대해 사용자는 다른 재질(materials)도 사용할 수 있습니다. 또한, 다른 유형의 입력 지오메트리도 추가하고 있습니다.

사용자 편의를 위해 단순한 상자, 평면, 원통으로 구성되어 있으나, 이를 통해 매우 흥미로운 작업이 가능합니다. 아티스트는 하이 폴리(high poly) 과정에서 볼트(bolts)를 생성하도록 하는 원통을 배치할 수 있습니다. 볼트 유형은 블렌더(Blender)의 UI를 통해 설정되며, 모든 볼트는 후디니(Houdini)에서 프로시저럴(procedurally)하게 생성됩니다. 아티스트는 또한 다음과 같은 지시를 내리는 상자를 추가할 수 있습니다.

금속 표면에 용접(weld)을 추가하는 공정으로, 플라스틱에는 주조될 때 생기는 이음매(cast seam)를 추가하는 과정입니다.

예술가는 고밀도(high poly) 지오메트리를 직접 제작하여 추가할 수도 있습니다. 모든 저밀도(low poly) 메시가 제작 과정에서 쉽게 고밀도로 변환되는 것은 아니기 때문입니다. 저밀도와 고밀도 메시의 형태 차이가 매우 커서, 고밀도 메시를 별도로 제작해야 하는 경우도 있습니다. 이러한 경우는 의외로 드물다고 합니다. 다음으로는 UV에 대해 설명하겠습니다.

게임 개발에서 좋은 UV는 수요가 높습니다. 텍스처 맵 크기에 따라 결정되는, 보기 좋은 밉맵(mipmaps) 생성을 위한 충분한 패딩(padding)과 함께 타이트하게 압축되기를 원합니다. 또한, 균일한 텍셀 밀도(texel density), 깔끔하게 회전된 쉘(shells), 직선화된 쉘, 그리고 가능한 경우 겹쳐진 쉘을 선호합니다. 저희 공정에서는 UV 작업이 완전히 자동화되지만, 필요에 따라 아티스트는 커스텀 테마, 언폴드(unfold) 또는 레이아웃을 직접 설정할 수 있습니다. 기존 자동 UV 솔루션을 시도해보았으나 만족스러운 결과를 얻지 못해, Houdini로 자체 솔루션을 개발하게 되었습니다. 이제 자동 UV 공정에서 실행되는 단계들을 설명드리겠습니다.

먼저, 선명한 엣지를 분리합니다. 이는 보기 좋은 normal map을 bake하기 위해 필요합니다. 이후, 초기 컷팅 후 생성된 shell이 UV가 왜곡되었는지 여부에 따라 shell을 정렬합니다.

다음 단계는 torses 및 길고 구불구불한 파이프와 같이 더 복잡하지만 결정 가능한 모양에 대한 seams를 찾는 것입니다. 우리는 각각의 UV island의 geometry를 분석하여 어떤 유형의 모양인지 파악하고, 각 표면 유형을 고유한 절차에 따라 처리합니다. 그 후, 우리는 ...의 경계 지점을 찾습니다.

잔여 왜곡된 쉘과 UV 심(seam)이 해당 점들 사이의 최단 경로를 따라 잘린 상태입니다.

왜곡되지 않은 쉘(non-distorted shells)의 경우, 'closed strips'라고 부르는 것을 다루게 됩니다. 이를 분할하여 곧게 펼 수 있으며, 이는 이전 슬라이드에서 분할이 필요했던 왜곡된 쉘(distorted shells)과 거의 동일한 방식으로 수행됩니다.

UV shell을 straightening하는 작업은 straightening할 UV shell의 topology에 따라 두 가지 방식으로 수행됩니다. shell의 topology가 완벽한 gridded 형태일 경우, grid 형태로 쉽게 layout할 수 있습니다. 하지만 topology가 더 복잡할 경우에는 다른 방법을 사용해야 합니다. 이 경우, shell을 위한 interior skeleton을 생성하고, shell을 skeleton spline에 bind하여 spline을 straightening하는 방식을 사용합니다. 마지막으로, layout 전에,

we need to rotate the shells properly. We do this through finding the longest accumulated border length that's either parallel or perpendicular to each other and then make sure that those edges are aligned with the UV axis. For the layout, Houdini's UV layout node

does an excellent job at packing the shells tightly and quickly. So what was left for us to set up was dynamic texture size depending on ideal texel density per object type, which also tells the layout how much padding is needed between shells, and dynamically finding out the optimal aspect ratio for the texture depending on those same factors and UV coverage.

In addition, we're also overlapping UV shells based on material, shell shape and size, and most importantly, whether or not stacked shells will allow for a good looking ambient occlusion bake. We're also looking at implementing stacking based on 3D proximity, UV shell size and viewing angles.

That was it for the UVs. For the high poly, most of what we're ever after is round shapes with smooth surfaces and smooth corners. And this is exactly what we get through subdividing and voxelizing the low poly in Houdini, which produces a very similar result to dynameshing a mid-poly geometry in ZBrush.

먼저, 둥근 형태를 가진 모든 입력 지오메트리는 하이 폴리곤(high poly)에서 거친 부분이 드러나지 않도록 부드럽게 만들기 위해 서브디비전(subdivision)됩니다. 서브디비전 시 모든 하드 엣지(hard edges)는 크리즈(creased) 처리됩니다. 결과적으로 하드 엣지 사이의 표면만 둥글게 처리되므로, 로우 폴리곤(low poly)에 대한 일반적인 서브디비전 토폴로지(topology)의 필요성은 매우 드물며, 이 과정에서 발생할 수 있는 약간의 핀칭(pinching)은 이후 복셀라이제이션(voxelization) 단계에서 자연스럽게 완화될 것입니다.

Next up, the process applies the booleans to the subdivided geometry. Luckily, Houdini has a really solid boolean system that can handle the very heavy boolean operations for these densely subdivided meshes. We don't have to worry about what the resulting topology looks like either, since the voxelization process that happens later will work independently of the topological structure of the input geometry.

이후, welds 및 cast seams 생성 프로세스가 실행됩니다. 나중에 voxelize될 것이므로, 많은 교차점과 기하학적 형상이 이상하게 보이는 것은 중요하지 않습니다.

드디어 복셀화(voxelization) 단계에 이르렀습니다. 모든 데이터가 복셀로 변환되면, 폴리곤으로 다시 전환하기 전에 볼륨에 스무딩(smoothing) 연산을 적용합니다. 이 과정을 통해 모든 모서리가 부드럽게 베벨(beveled) 처리된 최종 결과물을 얻게 됩니다.

Since the resulting geometry can easily be tens of millions of polygons, a mesh reduction is being run in order to speed up the loading of the mesh for the baking process.

And that's it for the automatic high poly meshes. At this stage, when we have the UVs and the high poly generated, we want to have the bakes rendered out. Since the high poly is generated from the low poly, we don't have to manually match corresponding low and high poly pieces to each other, that's all taken care of through the process.

노멀맵 스큐잉(normamap skewing)을 방지하기 위해 모든 로우 폴리(low poly) 메시에는 스큐 메쉬(skew mesh)가 자동으로 생성됩니다.

bakes가 완료되면, 사용자는 Blender에서 바로 결과를 확인할 수 있습니다.

baked textures applied for quick reviewing. That's it for each of the larger processes.

Here are a couple of conclusions that we've come to at this point. Automation is great. Automating the non-artistic steps makes it possible to truly focus on the art aspect of what we do. Simplicity is great too. Most of the actual process is never seen by the user and they can quickly forget about all the technical stuff. And even though some of this might seem advanced or complicated to set up, everything can be broken down into discrete steps that can often have utility on their own, even before it's been put together into a full process. Hitchability really is key. Being able, for instance, to change the length of part of an asset and simply hitting process instead of having to manually adjust UVs, high poly and bakes results in radically different levels of exploration and momentum in the art creation process. Now that we have it up and running, considering a manual workflow is out of the question and we'll continue to develop this until we've completely run out of ideas. It doesn't seem like that is likely to happen for a really long time. We're still waiting to see if the black boxed nature of the process will in any way be limiting to the artist, since results can be difficult to predict without having a full understanding of what's going on behind the scenes. We're working on setting up easy to understand documentation, error messages for incorrectly set up assets, and easy to understand example assets. There are also lots of things that can still be done when it comes to previewing the results inside of Blender before processing by applying similar mesh modifications through modifiers. When it comes to the process itself, it is incredibly easy to debug and understand since almost all of it is set up with nodes in Houdini. Voxels are great, but really sharp meshes require dense voxel grids which can become slow to process. We've investigated baking rounded shaders as well, but they have their own limitations. I have a feeling that we might end up with a mix between both approaches in the future. There is still lots to do and the possibilities seem endless. We are working on a texture setup that uses the same mindset of really simple inputs and fully automated results. We're also working on automatically importing and setting up all kinds of assets in Unreal as part of the process and it shows great promise. Lastly, I want to say a huge thank you to Maxi Vasquez who has worked on this process with me since the start and to the rest of the team at Embark who made this all a reality. That's it! Please feel free to ask any questions and I'll try to answer them as best I can. Thank you!